home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #5 / Amiga Plus CD - 2000 - No. 5.iso / Tools / Dev / gltron_src / computer.c < prev    next >
C/C++ Source or Header  |  2000-01-01  |  3KB  |  131 lines

  1. #include "gltron.h"
  2.  
  3. int freeway(Data *data, int dir) {
  4.   int i;
  5.   int wd = 20;
  6.  
  7.   for(i = 1; i < wd; i++)
  8.     if(getCol((int)data->posx + dirsX[dir] * i, (int)data->posy + dirsY[dir] * i,
  9.        colwidth, colmap)) break;
  10.   return i;
  11. }
  12.  
  13. void getDistPoint(int dir, int d, int *x, int *y) {
  14.   *x += dirsX[dir] * d;
  15.   *y += dirsY[dir] * d;
  16. }
  17.  
  18. void setPos(Data *data, int *x, int *y) {
  19.   *x = (int)data->posx;
  20.   *y = (int)data->posy;
  21. }
  22.  
  23. #define MAX_PROBE_DIST 20
  24.  
  25. #define LEFT(x) ((x + 3) % 4)
  26. #define RIGHT(x) ((x + 1) % 4)
  27.  
  28. static int probe_dists[][2] = {
  29.   { 10, 20 },
  30.   { 8, 10 },
  31.   { 5, 8 },
  32.   { 2, 5 },
  33.   { 0, 0 },
  34. };
  35.  
  36. static int target_dir[][2] = {
  37.   { 0, 1 },
  38.   { 2, 1 },
  39.   { 3, 0 },
  40.   { 3, 2 }
  41. };
  42.  
  43. static int turn_time[] = {
  44.   300, 300, 200, 100
  45. };
  46.  
  47. static float max_moves[] = {
  48.   0.30, 0.40, 0.5, 0.5
  49. };
  50.  
  51. static int spiral[] = {
  52.   10, 10, 10, 10
  53. };
  54.     
  55. void doComputer(Player *me, Data *him) {
  56.   AI *ai;
  57.   Data *data;
  58.   int i, j, level, x, y, rdist, ldist;
  59.  
  60.   if(me->ai == NULL) {
  61.     printf("This player has no AI data!\n");
  62.     return;
  63.   }
  64.   
  65.   data = me->data;
  66.   ai = me->ai;
  67.   ai->moves++;
  68.  
  69.   level = game->settings->ai_level;
  70.   /* avoid to short turns */
  71.   if(SystemGetElapsedTime() - ai->lasttime < turn_time[level])
  72.     return;
  73.  
  74.   /* first, check if we are in danger */
  75.   /* check the highest level first! */
  76.   for(i = level; i >= 0; i++) {
  77.     for(j = probe_dists[i][0]; j <= probe_dists[i][1]; j++) {
  78.       setPos(data, &x, &y);
  79.       getDistPoint(data->dir, j, &x, &y);
  80.       if(getCol(x, y, colwidth, colmap)) {
  81.     ai->danger = j;
  82.     break;
  83.       }
  84.     }
  85.     if(ai->danger != 0) break;
  86.   }
  87.  
  88.   if(ai->danger != 0 || ai->moves > max_moves[level] * game->settings->grid_size) {
  89.     ai->moves = 0;
  90.  
  91.     /* figure out how far it's to either side */
  92.     for(i = 1; i < MAX_PROBE_DIST; i++) {
  93.       setPos(data, &x, &y);
  94.       getDistPoint(LEFT(data->dir), i, &x, &y);
  95.       if(getCol(x, y, colwidth, colmap)) {
  96.     ldist = i;
  97.     break;
  98.       } else { ldist = i; }
  99.     }
  100.     for(i = 1; i < MAX_PROBE_DIST; i++) {
  101.       setPos(data, &x, &y);
  102.       getDistPoint(RIGHT(data->dir), i, &x, &y);
  103.       if(getCol(x, y, colwidth, colmap)) {
  104.     rdist = i;
  105.     break;
  106.       } else { rdist = i; }
  107.     }
  108.     /* decide where to turn */
  109.     if(ai->danger > rdist && ai->danger > ldist) {
  110.       ai->danger--;
  111.       return;
  112.     } else if(rdist > ldist && ai->tdiff > -spiral[level] ) {
  113.       turn(data, TURN_LEFT);
  114.       ai->tdiff--;
  115.     } else if(rdist < ldist && ai->tdiff < spiral[level] ) {
  116.       turn(data, TURN_RIGHT);
  117.       ai->tdiff++;
  118.     } else {
  119.       if(ai->tdiff > 0) { turn(data, TURN_LEFT); ai->tdiff--; }
  120.       else { turn(data, TURN_RIGHT); ai->tdiff++; }
  121.     }
  122.     ai->danger = 0;
  123.     ai->lasttime = SystemGetElapsedTime();
  124.   }
  125. }
  126.  
  127.  
  128.  
  129.  
  130.  
  131.